package pe.com.bbva.targps.bo.impl;

import java.util.List;
import java.util.regex.Pattern;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.Scheduler;
import org.springframework.stereotype.Service;

import pe.com.bbva.configuracion.bo.TurnoBO;
import pe.com.bbva.configuracion.domain.Configuracion;
import pe.com.bbva.configuracion.domain.Turno;
import pe.com.bbva.targps.bo.UpdateQuartzBO;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.bo.GenericBOImpl;

@Service("updateQuartzBO")
public class UpdateQuartzBOImpl extends GenericBOImpl<Configuracion> implements UpdateQuartzBO  {

Logger logger = Logger.getLogger(this.getClass());
	
	@Resource
	private Scheduler schedulerFactoryBean;
	
	@Resource
	private TurnoBO turnoBO;
	
	public void actualizarConfiguracionQuartz(Configuracion config, Turno turno, boolean intervalo){
		logger.info("Inicio Actualizacion de Cron****** " + config.getNombreConfiguracion());
		try {
			String configuracionCron = "15 * * * * ? *";
			String segundos = "0";
			String minutos = "0";
			String hora = "*";
			String diaMes = "*";
			String diaSemana = "?";
			String mes = "*";
			String anio = "*";
			
			if(config!=null && config.getEstado()!=null && config.getEstado().equals("0")){
				if(config.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_ANUAL)){
					mes = String.valueOf(config.getMesEjecucion());
					diaSemana = "?";
					diaMes = String.valueOf(config.getDiaEjecucion());
				}
				else if(config.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_MENSUAL)){
					diaSemana = "?";
					diaMes = String.valueOf(config.getDiaEjecucion());
				}
				else if(config.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_SEMANAL)){
					diaMes = "?";
					if(!config.getDiaLunes().equals("")){
						diaSemana = (diaSemana=="*"?"":",") + "1";
					}
					if(!config.getDiaMartes().equals("")){
						diaSemana = (diaSemana=="*"?"":",") + "2";
					}
					if(!config.getDiaMiercoles().equals("")){
						diaSemana = (diaSemana=="*"?"":",") + "3";
					}
					if(!config.getDiaJueves().equals("")){
						diaSemana = (diaSemana=="*"?"":",") + "4";
					}
					if(!config.getDiaViernes().equals("")){
						diaSemana = (diaSemana=="*"?"":",") + "5";
					}
					if(!config.getDiaSabado().equals("")){
						diaSemana = (diaSemana=="*"?"":",") + "6";
					}
					if(!config.getDiaDomingo().equals("")){
						diaSemana = (diaSemana=="*"?"":",") + "7";
					}
				}
				else if(config.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_DIARIA)){
					if(config.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_LABORABLE)){
						diaMes = "?";
						diaSemana = "1,2,3,4,5";
					}
					if(config.getFrecuenciaCarga().getId().equals(Constantes.ID_CONFIG_LABORABLE)){
						diaMes = "?";
						diaSemana = "6,7";
					}
				}
			}
			if(config.getId().equals(Constantes.ID_CONFIG_CARGA)){
				if(turno!=null){
					String []inicio = turno.getHoraInicio().split(Pattern.quote(":"));
					hora = inicio[0];
					minutos = inicio[1];
				}
				else{
					List<Turno> turnos = turnoBO.findTurnos(new Turno());
					for(Turno turnoTmp: turnos){
						int horaIniTmp = 0;
						if(turnoTmp.getHoraInicio()!=null && !turnoTmp.getHoraInicio().equals("")){
							String []horaInicio = turnoTmp.getHoraInicio().split(Pattern.quote(":"));
							if(hora.equals("*")){
								hora = "";
							}
							hora += (hora==""?"":",") + horaInicio[0];
							horaIniTmp = Integer.parseInt(horaInicio[0]);
						}
						if(turnoTmp.getHoraFin()!=null && !turnoTmp.getHoraFin().equals("")){
							String []horaFin = turnoTmp.getHoraFin().split(Pattern.quote(":"));
							int horaFinTmp = Integer.parseInt(horaFin[0]);
							if(horaIniTmp != horaFinTmp){
								if(hora.equals("*")){
									hora = "";
								}
								hora += (hora==""?"":",") + horaFin[0];
							}
						}
					}
				}
				if(config.getTipoTiempo()!=null && !config.getTipoTiempo().equals("")){
					if(config.getTipoTiempo().equals("M")){
						if(config.getIntervalo()!=null && !config.getIntervalo().equals(""))
							minutos = minutos + "/" + config.getIntervalo();
						segundos = "0";
					}
					else if(config.getTipoTiempo().equals("S")){
						if(config.getIntervalo()!=null && !config.getIntervalo().equals(""))
							segundos = segundos + "/" + config.getIntervalo();
						if(!minutos.equals("*"))
							minutos = "*";
					}
				}
			}
			else{
				String []horaGPS = config.getHoraGPS().split(Pattern.quote(":"));
				hora = horaGPS[0];
				minutos = horaGPS[1];
			}
			configuracionCron = segundos + " " + minutos + " " + hora + " " + diaMes + " " + mes + " " + diaSemana + " " + anio;
			System.out.println("Cambiando Configuracion de " + config.getNombreConfiguracion() +  " a: " + configuracionCron);
			try {
				logger.info("******Obteniendo Informacion del Monitor");
				if(schedulerFactoryBean.isInStandbyMode()){
					logger.info("*********Monitor is In Stand By Mode");
				}
				if(schedulerFactoryBean.isShutdown()){
					logger.info("*********Monitor is Shutdown");
				}
			} catch (Exception e) {
				logger.error("********Ocurrio un error obteniendo informacion del cron monitor");
			}
			
			logger.info("**********************CRON:"+ config.getNombreConfiguracion() +"*******************");
			CronTrigger cronTrigger = (CronTrigger) schedulerFactoryBean.getTrigger(config.getNombreConfiguracion(), "DEFAULT");
			if(cronTrigger!=null){
				cronTrigger.setCronExpression(configuracionCron);
				schedulerFactoryBean.rescheduleJob(config.getNombreConfiguracion(), "DEFAULT", cronTrigger);
			}else{
				logger.info("**********Ocurrio un Problema al cambiar Cron");
			}
		} catch (Exception e) {
			logger.error("Exception actua cron:"+e.getMessage());
		}
		logger.info("Fin Actualizacion de Cron****** " + config.getNombreConfiguracion());
	}
}